package com.project.role;

import com.project.frame.GameStartFrame;

import java.awt.*;
import java.util.List;

/**
 * 角色父类
 */
public abstract class BaseRole {
    /**
     * 角色X坐标
     */
    protected int x;
    /**
     * 角色Y坐标
     */
    protected int y;
    /**
     * 角色宽度
     */
    protected int width;
    /**
     * 角色高度
     */
    protected int height;
    /**
     * 角色图片
     */
    protected Image img;
    /**
     * 角色碰撞区域
     */
    protected Rectangle rect;

    /**
     * 角色血条
     */
    protected int hp;


    /**
     * 默认血量构造方法
     *
     * @param x
     * @param y
     * @param width
     * @param height
     */
    public BaseRole(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.rect = new Rectangle(x, y, width, height);
        this.hp = width;
    }

    /**
     * 是否带血量构造方法
     *
     * @param x
     * @param y
     * @param width
     * @param height
     * @param hp  是否需要血量
     */
    public BaseRole(int x, int y, int width, int height, int hp) {
        this(x, y, width, height);
        this.hp = hp;
    }


    /**
     * 绘制当前角色
     *
     * @param memoryGraphics 内存画笔
     */
    public void drawMyself(Graphics memoryGraphics) {
        memoryGraphics.drawImage(this.img, x, y, width, height, null);


        this.drawHp(memoryGraphics);
        this.move();
        this.setRect();
        this.collision();
        this.removeThis();

        //如果实现过攻击接口，为其添加攻击方法
        if (this instanceof Attack) {
            ((Attack) this).shoot();
        }
    }

    /**
     * 碰撞区域跟随角色一起移动
     */
    public void setRect() {
        //如果血量小于0，直接移动到删除区域
        if (this.hp <= 0) {
            this.x = this.y = -210;
        }
        rect.x = x;
        rect.y = y;
        rect.width = width;
        rect.height = height;
    }


    /**
     * 移除超角色
     */
    private void removeThis() {
        //移除超出屏幕的角色
        if (this.x > 1200 || this.x < -200 || this.y > 900 || this.y < -200) {
            GameStartFrame.roleList.remove(this);
        }
    }

    /**
     * 角色移动方法
     */
    public abstract void move();

    private void drawHp(Graphics memoryGraphics) {
        if (this.hp > 1) {
            memoryGraphics.setColor(Color.RED);
            memoryGraphics.fillRect(x, y - 8, hp, 8);
            memoryGraphics.setColor(Color.GREEN);
            memoryGraphics.drawRect(x, y - 8, width, 8);
        }

    }


    /**
     * 碰撞
     */
    public abstract void collision();


}
